ESP-IDFを使ってXIAO ESP32からHello World
Espressif が提供する開発環境 ESP-IDF を利用して、シリアル通信で XIAO ESP32C3(または XIAO ESP32S3) から Hello World を送信してみる。
環境
マシン
MacBook Pro
macOS
Ventura 13.4
チップ
Apple M1 Max
事前準備
code:sh
brew install cmake ninja dfu-util ccache
ESP-IDFをダウンロード
code:sh
mkdir -p ~/esp
cd ~/esp
ESP-IDF は ~/esp/esp-idf へダウンロードされる。
ESP-IDFをセットアップ
code:sh
cd ~/esp/esp-idf
./install.sh esp32c3
(XIAOESP32S3 の場合はこちらを実行)
code:sh
cd ~/esp/esp-idf
./install.sh esp32s3
環境変数のセットアップ
~/esp/esp-idf/export.sh を読み込むことでESP-IDFが有効になる。
code:sh
source ~/esp/esp-idf/export.sh
idf.py --version
最初のプロジェクト
まずはhello_worldプロジェクトをコピーしてくる。
code:sh
cd ~/esp
cp -r esp-idf/examples/get-started/hello_world/ .
ESP32ボードをPCと接続する。うちの環境だと /dev/cu.usbmodem1101 が出てくる。
code:sh
$ ls /dev/cu.*
/dev/cu.Bluetooth-Incoming-Port
/dev/cu.OpenRunProbyShokz
/dev/cu.usbmodem1101
プロジェクトの設定を変更
code:sh
cd ~/esp/hello_world/
# ターゲットを設定
# XIAO ESP32C3 の場合 → esp32c3
idf.py set-target esp32c3
# XIAO ESP32S3 の場合 → esp32s3
idf.py set-target esp32s3
# 設定メニューを開く
idf.py menuconfig
menuconfigを実行すると、こんなのが開く。今回は特にいじるところはないので q を押して終了する。
https://gyazo.com/ea9d798eac2af2766871558dd5d4c3b0
プロジェクトをビルドして、アップロード
code:sh
idf.py build
idf.py flash
アップロードに成功したら、シリアルモニタを起動。Hello World的なものが表示されたら成功。
うまく表示されない時はリセットボタンを押してみると良い感じに表示されることがある。
code:sh
idf.py monitor
以下のように表示されればOK
https://gyazo.com/1ca506404ff67101e200bea171743f52
Ctrl-] でモニタを終了する。
Lチカもしてみた
code:diff
diff --git a/main/hello_world_main.c b/main/hello_world_main.c
index 7010f3e..2c31915 100644
--- a/main/hello_world_main.c
+++ b/main/hello_world_main.c
@@ -13,9 +13,11 @@
+#include "driver/gpio.h"
+
void app_main(void)
{
- printf("Hello world!\n");
+ printf("Hello world!!!!\n");
/* Print chip information */
esp_chip_info_t chip_info;
@@ -42,6 +44,14 @@ void app_main(void)
printf("Minimum free heap size: %" PRIu32 " bytes\n", esp_get_minimum_free_heap_size());
+ gpio_set_direction(GPIO_NUM_10, GPIO_MODE_OUTPUT);
+ int level = 0;
+ while (true) {
+ gpio_set_level(GPIO_NUM_10, level);
+ level = !level;
+ vTaskDelay(300 / portTICK_PERIOD_MS);
+ }
+
for (int i = 10; i >= 0; i--) {
printf("Restarting in %d seconds...\n", i);
vTaskDelay(1000 / portTICK_PERIOD_MS);
参考